// https://leetcode.cn/problems/permutations/

// 题干：给定一个不含重复数字的数组 nums ，返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

// 示例：输入：nums = [1,2,3]
//       输出：[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

// 碎语：穷举题
//       1.画出决策树，越详细越好,它永远是第一步
//       2.全局代码
//       3.dfs函数
//       4.本题剪枝该怎么剪？如何避免再次选到一样的树？
//         放大是设立一个bool数组，bool[] check

#include <bits/stdc++.h>
using namespace std;

class Solution
{
    vector<vector<int>> ret; // 用作返回结果，更新内容
    vector<int> path; // 记录一下路径
    bool check[7]; // 标记是否已经使用过
public:
    vector<vector<int>> permute(vector<int>& nums)
    {
        // 递归出口，当遇到叶子节点的时候直接添加结果即可
        dfs(nums);
        return ret;
    }

    void dfs(vector<int>& nums){
        // 假设路径已经到了最后节点
        if (nums.size() == path.size()){
            ret.push_back(path);
            return ;
        }

        for (int i = 0 ; i < nums.size() ; i++){
            if (!check[i]){
                path.push_back(nums[i]);
                check[i] = true;
                dfs(nums);

                // 回溯->恢复现场
                path.pop_back();
                check[i] = false;
            }
        }
    }
};

int main()
{
    Solution sol;
    vector<int> nums = {1,2,3};

    vector<vector<int>> index = sol.permute(nums);
    for (auto arr : index){
        for (auto num : arr){
            cout << num << " ";
        }
        cout << endl;
    }

    return 0;
};







